#ifndef QUOTE_H
#define QUOTE_H

#include <string>
using namespace std;
class Quote {
  friend double print_total(ostream &, const Quote &, size_t); //定义为友元函数
public:
  /*	Quote() = default;//C++11新特性*/
  Quote(); //默认构造函数
  Quote(const string &book, double sales_price)
      : BookNo(book), price(sales_price){};
  string isbn() const { return BookNo; }; //保存每本书籍的编号
  virtual double net_price(size_t n) const //定义为虚函数，让派生类自己定价
  {
    return n * price;
  }

private:
  string BookNo; //书籍的ISBN编号
protected:
  double price; //普通状态下不打折的价格，C++11不支持非静态变量的类内初始化
};

double print_total(ostream &os, const Quote &item, size_t n) {
  //动态绑定的实例
  double ret = item.net_price(n);
  os << "ISBN:" << item.isbn() << endl;
  os << "sold:" << n << " total price: " << ret << endl;
  return ret;
}

class bulk_quote : public Quote {
public:
  bulk_quote(); //默认构造函数
  bulk_quote(string &book, double p, size_t n, double disc)
      : Quote(book, p), min_qty(n), discount(disc){}; //派生类构造函数
  // virtual double net_price(size_t) const;//重新声明，与下面的方式作用相同
  double net_price(size_t cnt)
      const override //允许派生类显示的注明它将使用哪个成员函数改写基类的虚函数
  {
    if (cnt >= min_qty) {
      return cnt * (1 - discount) * price;
    } else {
      return cnt * price;
    }
  }
  //除了自定义的版本，还可以访问其基类的相应成员
private:
  double discount; //适用折扣的最低购买量
  size_t min_qty;  //折扣额，C++11新标准
};

#endif // QUOTE_H
